<?php namespace Home\Controller; 

use Hdphp\Controller\Controller;

//测试控制器
class LibiaoController extends Controller{
    public function index(){
         // 实例化分类表
    	$arcModel = new \Common\Model\Cate;
         //获取所有数据
		 $arcData=$arcModel->get();
//         p($arcData);
          //分配给模板
		 View::with('arcData',$arcData);
		 //实例化商品表
		 $goodsModel=new \Common\Model\Goods;
	      //获得商品的所有值
		 $goodsData=$goodsModel->get();
	        //分配到模板
//	        p($goodsData);
		 View::with('goodsData',$goodsData);
		
		 
		 
		 
           // 获得顶级分类
			$topCate=Db::table('category')->where("pid=0")->get();
			View::with('topCate',$topCate);
			//根据当前的cid获得对应的商品的gid
			$gids=$this->cidGids(Q('get.cid',0,'intval'));
			//2.根据gid找到商品属性
			$gevalue=$this->gidGetAttr($gids);
			View::with('gevalue',$gevalue);
//			p($gevalue);
			//3.处理筛选参数Param 0_0_0_.....
			$num=count($gevalue);
			//这里看看有没有num这个变量，有的话执行下面的，没有就等于1；
			if(!$num){
				$num=1;
			}
			$param=isset($_GET['param'])? explode('_',$_GET['param']) : array_fill(0, $num, 0);
			View::with('param',$param);
			//4.通过param参数筛选商品gid
			$resultGids = $this->filter($param,$gids);

            // 载入模板
    	 View::make();
	   }




       private function filter($param,$cidGids){

       	
       	  $gids=array();
		  foreach ($param as $gaid) {
	
		  	if($gaid){
		  		//1.找到gtvalue,比如找到"红色"
		  		$gtvalue=Db::table('gevalue')->where("goods_gid={$gaid}")->pluck('gtvalue');
				//在这里先判断。有的话就走这一步。下面的不执行，无限循环。会报错（这不是一个数组）
				if($gtvalue){
					 $gids[]=Db::table('gevalue')->where("gtvalue='{$gtvalue}'")->lists('gaid');
				}
				//2.通过"红色"找到对应的商品的id
//		  	p($gtvalue);
		      	}
		     }
		  //如果点击了“不限”之外的属性
		  $gidsTemp=array();
		  if($gids){
		  	//取交集
		  	$gidsTemp=$gids[0];
			foreach ($gids as $v){
				$gidsTemp=array_intersect($gidsTemp,$v);
			}	
//			p($gidsTemp);die;
			//和当前分类对应的gid再取交集
			return array_intersect($gidsTemp,$cidGids);
		     }else{
		     	//如果是全部是“不限”的时候
		     	return $cidGids;
		     }
			
       }
	   
	   
	   
	//通过gid获得商品的属性
	private function gidGetAttr($gaid){
	
		//判断一下
		if($gaid){
			$data=Db::table('gevalue')->where("goods_gid in(".implode(',',$gaid).")")->groupBy('gtvalue')->get();
		}else{
			$data=array();
		}

		//1.把相同类型属性id的归结在一起
		$sameAttr=array();
		foreach ($data as $v){
			$sameAttr[$v['typevalue_taid']][]=$v;
		}
		//2.组合数组
		$temp=array();
		foreach ($sameAttr as $taid => $v) {
			$temp[]=array(
			'taname'=>Db::table('typevalue')->where("taid={$taid}")->pluck('taname'),
			'value'=>$v
			);
		}
		return $temp;
	}  
	   
	//通过cid获得gid
	private function cidGids($cid){
		//1.通过当前的cid获得对应的所有的子集cid
		$cids=$this->getSonGids(Db::table('category')->get(),$cid);
		$cids[]=$cid;
		//2.通过子集cid查找对应商品的gid
		$gids=Db::table('goods')->where("category_cid in(". implode(',',$cids) .")")->lists('gid');
		return $gids;
	}   
	 //递归获得指定cid的所有子集
	 public function getSonCids($data,$cid){
	 	$temp = array();
		foreach ($data as $v){
		  if($v['pid']==$cid){
		  	$temp[]=$v['cid'];
			$temp=array_merge($temp,$this->getSonCids($data,$v['cid']));
		  }
		}
	   return $temp;  
	 }  
	   
	   
	   
	   
	   
	   
	   
	   
	   
	   
	   
	   
	   
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	   
   }

   